package com.zy.design.pattern.factory.method;

import com.zy.design.pattern.factory.base.IRuleConfigParser;

import java.util.Optional;

/**
 * @author zhaoyi
 * @date 2021/3/30 14:48
 *
 *
 * 当对象的创建逻辑比较复杂，不只是简单的 new 一下就可以，
 * 而是要组合其他类对象，做各种初始化操作的时候，我们推荐使用工厂方法模式，
 * 将复杂的创建逻辑拆分到多个工厂类中，让每个工厂类都不至于过于复杂。
 * 而使用简单工厂模式，将所有的创建逻辑都放到一个工厂类中，会导致这个工厂类变得很复杂
 *
 * 在某些场景下，如果对象不可复用，那工厂类每次都要返回不同的对象。
 * 如果我们使用简单工厂模式来实现，就只能选择第一种包含 if 分支逻辑的实现方式。
 * 如果我们还想避免烦人的 if-else 分支逻辑，这个时候，我们就推荐使用工厂方法模式
 */
public class MethodConfigSource {

    public void load(String path) {
        String file = getFileExtension(path);
        IMethodRuleConfigFactory factory = RuleConfigFactoryMap.getFactory(file);
        IRuleConfigParser parser = factory.createParser();
        String name = "如果创建逻辑比较复杂 or 如果对象不可复用又想避免if-else  -> 工厂方法模式";
        parser.parse(name);
    }

    private String getFileExtension(String filePath) {
        return Optional.ofNullable(filePath)
                .map(r -> {
                    String[] split = r.split("\\.");
                    return split[split.length - 1];
                }).orElseThrow(()->new IllegalArgumentException(filePath));
    }

}
